package org.hw.base;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 使用LinkedHashMap 实现LRU算法
 */
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
    private final int cacheSize;

    public LRUCache(int cacheSize) {
        // LinkedHashMap的accessOrder参数默认为false，按照插入顺序排序，设置为true，使按访问顺序排序
        super(16, 0.75f, true);
        this.cacheSize = cacheSize;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        // 当缓存大小超过指定的大小时，移除最老的元素
        return size() > cacheSize;
    }

    public static void main(String[] args) {
        LRUCache<Integer, String> cache = new LRUCache<>(3);
        cache.put(1, "A");
        cache.put(2, "B");
        cache.put(3, "C");
        System.out.println(cache); // 输出：{1=A, 2=B, 3=C}

        cache.get(1); // 访问元素 1
        cache.put(4, "D"); // 添加新元素 4，由于缓存容量为 3，元素 2 将被移除
        System.out.println(cache); // 输出：{3=C, 1=A, 4=D}
    }
}